package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	// 读写锁【读锁为共享锁，可以重复锁定。写锁为互斥锁，只能被一个锁定(写锁和读锁也会互斥)】
	mutex := sync.RWMutex{}

	go func() {
		//读锁
		mutex.RLock()
		defer mutex.RUnlock()
		for i := 1; i <= 5; i++ {
			time.Sleep(time.Millisecond)
			fmt.Println(i)
		}
	}()

	go func() {
		//此处使用写锁，当所在读锁时候会等待读锁释放后，才会锁定
		mutex.Lock()
		defer mutex.Unlock()
		for i := 1; i <= 5; i++ {
			time.Sleep(time.Millisecond)
			fmt.Println(i * 10)
		}
	}()
	//因为写锁与读锁产生的互斥效应，因此是按照顺序输出
	time.Sleep(time.Second * 2)
}
